package ixOrm

import (
	"context"
	"time"

	"gorm.io/gorm"
)

// Config 数据库配置
type Config struct {
	// 直接连接字符串（优先级最高）
	SqlConn string `json:"sql_conn"` // 完整的数据库连接字符串，如果设置则忽略其他连接参数

	// 数据库连接配置
	Host     string `json:"host"`
	Port     int    `json:"port"`
	Username string `json:"username"`
	Password string `json:"password"`
	Database string `json:"database"`

	// 连接参数配置
	Charset   string `json:"charset"`    // 字符集，默认 utf8mb4
	Collation string `json:"collation"`  // 排序规则，默认 utf8mb4_unicode_ci
	ParseTime bool   `json:"parse_time"` // 是否解析时间，默认 true
	Loc       string `json:"loc"`        // 时区，默认 Local

	// 连接池配置
	MaxOpenConns    int           `json:"max_open_conns"`
	MaxIdleConns    int           `json:"max_idle_conns"`
	ConnMaxLifetime time.Duration `json:"conn_max_lifetime"`

	// GORM配置
	SlowThreshold time.Duration `json:"slow_threshold"`
	LogLevel      int           `json:"log_level"`
	GormConfig    *gorm.Config  `json:"-"` // 自定义GORM配置，优先级最高

	// Debug配置
	DebugMode bool `json:"debug_mode"` // 调试模式，默认false

	// 缓存配置（可选）
	EnableCache    bool          `json:"enable_cache"`
	CacheType      CacheType     `json:"cache_type"`       // 缓存类型，默认Redis
	CacheTTL       time.Duration `json:"cache_ttl"`        // 默认缓存TTL
	RedisCacheTTL  time.Duration `json:"redis_cache_ttl"`  // Redis缓存TTL
	MemoryCacheTTL time.Duration `json:"memory_cache_ttl"` // 内存缓存TTL
	CacheDebugMode bool          `json:"cache_debug_mode"` // 缓存调试模式
	RedisConfig    *RedisConfig  `json:"redis_config"`
}

// RedisConfig Redis配置
type RedisConfig struct {
	Conn     string `json:"conn"` // 完整的Redis连接字符串（优先级最高）
	Host     string `json:"host"`
	Port     int    `json:"port"`
	Password string `json:"password"`
	Database int    `json:"database"`
	Prefix   string `json:"prefix"` // Redis键前缀，默认为"ixorm:"
}

// QueryOptions 查询选项
type QueryOptions struct {
	TableName     string                   `json:"table_name"`
	Conditions    map[string]interface{}   `json:"conditions"`
	OrConditions  []map[string]interface{} `json:"or_conditions"`  // OR 条件组
	RawConditions []RawCondition           `json:"raw_conditions"` // 原始 SQL 条件
	OrderBy       []string                 `json:"order_by"`
	GroupBy       []string                 `json:"group_by"`
	Limit         int                      `json:"limit"`
	Offset        int                      `json:"offset"`
	Select        []string                 `json:"select"`
	UseCache      bool                     `json:"use_cache"`
	CacheType     CacheType                `json:"cache_type"` // 缓存类型选择
	CacheKey      string                   `json:"cache_key"`
	CacheTTL      time.Duration            `json:"cache_ttl"`
	Context       context.Context          `json:"-"`
	Extensions    map[string]interface{}   `json:"extensions"`
}

// RawCondition 原始 SQL 条件
type RawCondition struct {
	SQL    string        `json:"sql"`
	Values []interface{} `json:"values"`
}

// CreateOptions 创建选项
type CreateOptions struct {
	TableName   string                 `json:"table_name"`
	AutoMigrate bool                   `json:"auto_migrate"`
	Context     context.Context        `json:"-"`
	Extensions  map[string]interface{} `json:"extensions"`
}

// UpdateOptions 更新选项
type UpdateOptions struct {
	TableName  string                 `json:"table_name"`
	Conditions map[string]interface{} `json:"conditions"`
	ClearCache bool                   `json:"clear_cache"`
	Context    context.Context        `json:"-"`
	Extensions map[string]interface{} `json:"extensions"`
}

// DeleteOptions 删除选项
type DeleteOptions struct {
	TableName  string                 `json:"table_name"`
	Conditions map[string]interface{} `json:"conditions"`
	SoftDelete bool                   `json:"soft_delete"`
	ClearCache bool                   `json:"clear_cache"`
	Context    context.Context        `json:"-"`
	Extensions map[string]interface{} `json:"extensions"`
}

// PaginationResult 分页结果
type PaginationResult struct {
	Total      int64       `json:"total"`
	Page       int         `json:"page"`
	PageSize   int         `json:"page_size"`
	TotalPages int         `json:"total_pages"`
	Data       interface{} `json:"data"`
}

// CacheType 缓存类型
type CacheType int

const (
	CacheTypeRedis  CacheType = iota // Redis缓存（默认）
	CacheTypeMemory                  // 内存缓存
	CacheTypeNone                    // 不使用缓存
)

// String 返回缓存类型的字符串表示
func (ct CacheType) String() string {
	switch ct {
	case CacheTypeRedis:
		return "redis"
	case CacheTypeMemory:
		return "memory"
	case CacheTypeNone:
		return "none"
	default:
		return "unknown"
	}
}

// LogLevel 日志级别常量
const (
	LogLevelSilent = iota + 1
	LogLevelError
	LogLevelWarn
	LogLevelInfo
)
